package org.example.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

import org.springframework.context.annotation.Configuration;
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;

/**
 * 这是分页插件PageHelper的配置信息
 * 使用PageHelper的原因是MP的分页对于多表分页查询和自定义查询的分页支持不够优秀
 */
@Configuration
public class PageHelperConfig {

    /**
     * 可能存在多个连接工厂，是允许这么注入的
     */
    @Resource
    private List<SqlSessionFactory> sqlSessionFactoryList;

    @PostConstruct
    public void initConfig() {
        //mybatis 设置PageHelper分页插件
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        // 设置数据源方言，使用mysql (oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby)
//        properties.setProperty("helperDialect", "mysql");
        // 支持自动分页，需要保证查询方法的对象中必须含有pageNum，pageSize
        // (pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero)
        properties.setProperty("supportMethodsArguments", "true");
        // 支持查询全部信息,pageSize=0 ，则返回全部
        properties.setProperty("pageSizeZero", "true");
        // 支持异常页码查询,默认false,pageNum<=0时查第一页，pageNum > 最大页则查询最后一页
        properties.setProperty("reasonable", "true");

        pageInterceptor.setProperties(properties);

        //mybatis-plus 内置分页拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

        sqlSessionFactoryList.forEach(factory -> {
            factory.getConfiguration().addInterceptor(pageInterceptor);
            factory.getConfiguration().addInterceptor(interceptor);
        });
    }

}
